<?php
/**
 * @brief Klasa kontrolera Mymca
 * 
 * Klasa udostępnia wszystkie akcje dostępne z profilu użytkownika. Ponieważ w
 * w większości działanie tych akcji pozostawia trwały ślad na systemie, wszystkie
 * akcje z teko kontrolera są dostępne dopiero po wcześniejszym zalogowaniu się.
 * 
 */
class MymcaController extends Zend_Controller_Action
{

    protected $_user = null; /*!< Pole na dane zalogowanego użytkownika*/

    /**
     * @brief Standardowa metoda poprzedzająca działanie akcji.
     *
     * Przed wykonaniem akcji, przekazywany jest do wyświetlenia widok pomocniczy
     * nagłówka strony, pobierane są wiadomości z flashMessengera oraz pobierane są
     * dane użytkownika z Zend_Auth.
     * 
     */
    public function preDispatch()
    {
        $this->view->render('utility/_headbox.phtml');

        
        $auth = Zend_Auth::getInstance();
        if($auth->hasIdentity()){
            $this->_user = $auth->getIdentity();
        } else {
            $this->_helper->flashMessenger->addMessage("warning/Zaloguj się!");
            $this->_helper->redirector('login','auth');
        }
        $this->_flashMessenger = $this->_helper->getHelper('FlashMessenger');
        $this->view->messages = $this->_flashMessenger->getMessages();
        
    }
    
    /**
     * @brief Akcja index
     * 
     * Akcja wyświetla stronę główną profilu użytkownika, na której wyświetlane
     * są jego dane kontaktowe. Można z jej poziomu zarządzić zmianę adresu,
     * emaila oraz hasła użytkownika. Ponadto na stronie wyświetlane są proste 
     * statystyki.
     */
    public function indexAction()
    {

        
        $this->view->user = $this->_user;
        
        $mapper= new Application_Model_MarketEntityMapper();
        $this->view->address = $mapper->find($this->_user->login)->getAddress();

    }

    /**
     * @brief Akcja new item
     * 
     * Akcja umożliwiająca definiowanie nowego towaru. Aby było to możliwe trzeba
     * najpierw wybrać lokalizację w których będą oferowane towary. Trzeba również
     * określić kategorię nowego towaru. 
     * 
     */
    public function newItemAction()
    {
        throw new Exception('stara akcja newItemAction');
        
    }

    /**
     * @brief Akcja edit commodity
     * 
     * Jak nazwa wskazuje, akcja umożliwia zmianę szczegółów zdefiniowanego towaru.
     * Ponadto umożliwia wyświetlenie szczegółowych danych o towarze.
     * 
     */
    public function editCommodityAction()
    {
        throw new Exception('porzucona akcja  edit Commodity');
        
    }

    /**
     * @brief Akcja commodities
     * 
     * Akcja wyświetlająca listę niewykorzystanych towarów użytkownika.
     * Umożliwia wybór kategorii nowego towaru, co jest pierwszym etapem 
     * definiowania towaru.
     * 
     */
    public function commoditiesAction()
    {
        $this->_helper->redirector('index','commodities');
    }
    
    /**
     * @brief Akcja periods
     * 
     * Akcja wyświetlająca listę aktualnych terminów dostaw. Zarówno użytkownika
     * jak i globalnych. Akcja umożliwia tworzenie nowych terminów.
     * 
     */
    public function periodsAction()
    {
        $form= new Application_Form_AddPeriod();
        $this->view->form = $form;
        $request = $this->getRequest();
        $mapper = new Application_Model_CalendarPeriodMapper();
        
        if($request->isPost()){
            if($form->isValid($request->getPost())){
                $period = new Application_Model_CalendarPeriod($form->getValues());
                $startTime = new Zend_Date($period->getStartTime(),'dd/MM/YYYY');
                $endTime = new Zend_Date($period->getEndTime(),'dd/MM/YYYY');
                if($startTime->isEarlier($endTime) && ($startTime->isLater(Zend_Date::now()))){
                    $period->setStartTime($startTime->toString('YYYY-MM-dd HH:mm:ss'));
                    $period->setEndTime($endTime->toString('YYYY-MM-dd HH:mm:ss'));
                    $period->setPeriodType('userDefined');
                    $period->setMarketEntity_id($this->_user->login);
                    $mapper->save($period);
                    $this->view->messages[] = 'success/Dodano nowy okres';
                } else {
                    $this->view->messages[] = 'error/Wprowadzono błędne daty';
                }
                
            }
        }
        $query = 'startTime > NOW() and( periodType = "global" or (periodType = "userDefined" and MarketEntity_id = "'.$this->_user->login.'"))';
        $this->view->periods = $mapper->fetchAll($query);
    }

    /**
     * @brief Akcja auctions
     * 
     * Akcja udostępniająca pierwszy etap tworzenia aukcji. Definiuje się na niej 
     * ogólne parametry aukcji oraz wybiera towary, będące oferowane na aukcji.
     * Szczegóły aukcji są zapisywane w sesji. Jak już istnieją jakieś, to zostanie
     * nimi wypełniony formularz, po czym zostaną one wymazane z sesji.
     */
    public function auctionsAction()
    {
        
        $mapper = new Application_Model_CommodityMapper();
        $query = 'MarketEntity_id = "'.$this->_user->login.'" and used = 0';
        $commodities = $mapper->fetchAll($query);
        if(empty($commodities)){
                
                $this->_helper->redirector('commodities', 'mymca');
        }
        $this->view->commodities = $commodities;
        $form = new Application_Form_Auction(array('query'=>$query));
        $auctionNamespace = new Zend_Session_Namespace('auction');
        if (!isset($auctionNamespace->initialized)) {
            $auctionNamespace->initialized = true;
        } else {
            $pValues['title'] = $auctionNamespace->title;
            $pValues['description'] = $auctionNamespace->description;
            $form->populate($pValues);
            $auctionNamespace->unsetAll();
            $auctionNamespace->initialized = true;
        }
        
        $this->view->form = $form;
        
        $request = $this->getRequest();
        
        if($request->isPost()){
            if($form->isValid($request->getPost())){
                $values = $form->getValues();
                
                $auctionNamespace->title = $values['title'];
                $auctionNamespace->description = $values['description'];
                $auctionNamespace->hiddenOffers = $values['hiddenOffers'];
                $auctionNamespace->date = $this->getDateTime($values['days']);
                $auctionNamespace->days = $values['days'];
                $auctionNamespace->commodities = $values['commodities'];
                $auctionNamespace->pointer = current($auctionNamespace->commodities);
                
                $this->_helper->redirector('auctions2', 'mymca');
                
            }
        }
        
    }

    /**
     * @brief Akcja auction2
     * 
     * Akcja udostępnia drugi etap tworzenia aukcji - tworzenie wiązek.
     * Informacje z formularza zostaną przechowane w sesji. 
     * 
     */
    public function auctions2Action()
    {
        $auctionNamespace = new Zend_Session_Namespace('auction');
        $form = new Application_Form_Auction2();
        $commodities = $auctionNamespace->commodities;
        
        foreach ($commodities as $commodity) {
            $form->addCommodity($commodity);
        }
        $form->addSubmit();
        
        $this->view->form = $form;
        $request = $this->getRequest();
        
        if($request->isPost()){
            if($form->isValid($request->getPost())){
                $values = $form->getValues();
                $auctionNamespace = new Zend_Session_Namespace('auction');
                $auctionNamespace->offeredPrice = $values['offeredPrice']; 
                $auctionNamespace->minVolume = $values['minVolume']; 
                $auctionNamespace->maxVolume = $values['maxVolume'];
                foreach ($values as $key=>$value) 
                {
                    $val = explode('NR', $key, 2);
                    if($val[1] != NULL){
                        $quantity[$val[1]] = $value['quantity'];
                        $shareFactor[$val[1]] = $value['shareFactor'];
                    }
                }
                
                $auctionNamespace->quantity = $quantity;
                $auctionNamespace->shareFactor = $shareFactor;
                
                
                $this->_helper->redirector('auction-summary', 'mymca');
            }
        }    
    }

    /**
     * @brief Akcja auction summary
     * 
     * Akcja wyświetla podsumowanie wprowadzonych danych, przed 
     * ostatecznym zatwierdzeniem aukcji.
     * 
     */
    public function auctionSummaryAction()
    {
        $this->view->auctionNamespace = new Zend_Session_Namespace('auction');
        $this->view->form = new Application_Form_Accept();
    }

    /**
     * @brief Akcja save auction
     * 
     * Akcja tworzy na podstawie danych z sesji nowa aukcję.
     * Akcja nie posiada własnego widoku.
     */
    public function saveAuctionAction()
    {
        
        if($this->getRequest()->isPost()){
            $auctionNamespace = new Zend_Session_Namespace('auction');

            $auctionMapper = new Application_Model_AuctionMapper();
            $offerMapper = new Application_Model_OfferMapper();
            $offerComponentMapper = new Application_Model_OfferComponentMapper();
            $commodityMapper = new Application_Model_CommodityMapper();
            $offerStatusMapper = new Application_Model_OfferStatusMapper(); 

            $auction = new Application_Model_Auction();
            $auction->setMarketEntity_id($this->_user->login);
            $auction->setTitle($auctionNamespace->title);
            $auction->setDescription($auctionNamespace->description);
            $auction->setStartTime($this->getDateTime(0));
            $auction->setEndTime($this->getDateTime($auctionNamespace->days));
            $auction->setHiddenOffers($auctionNamespace->hiddenOffers);
            $auction_id = $auctionMapper->save($auction);

            $offer = new Application_Model_Offer();
            $offer->setAuction_id($auction_id);
            $offer->setMarketEntity_id($this->_user->login);
            $offer->setMinVolume($auctionNamespace->minVolume);
            $offer->setMaxVolume($auctionNamespace->maxVolume);
            $offer->setOfferedPrice($auctionNamespace->offeredPrice);
            $offer->setFirstOffer(1);
            $offer_id = $offerMapper->save($offer);

            

            foreach ($auctionNamespace->commodities as $commodity_id) {
                $component = new Application_Model_OfferComponent();
                $component->setOffer_id($offer_id);
                $component->setCommodity_id($commodity_id);
                $component->setQuantity($auctionNamespace->quantity[$commodity_id]);
                $component->setShareFactor($auctionNamespace->shareFactor[$commodity_id]);
                $offerComponentMapper->save($component);

                $commodity = $commodityMapper->find($commodity_id);
                $commodity->setUsed(1);
                $commodityMapper->save($commodity);

            }
            
            $offerStatus = new Application_Model_OfferStatus();
            $offerStatus->setOffer_id($offer_id);
            $offerStatus->setStatus('Otwarta');
            $offerStatus->setStartTime($this->getDateTime(0));
            $offerStatus->setEndTime($this->getDateTime($auctionNamespace->days));
            $offerStatusMapper->save($offerStatus);

            $offerStatus->setStatus('Zamknięta');
            $offerStatus->setStartTime($this->getDateTime($auctionNamespace->days));
            $offerStatus->setEndTime($this->getDateTime(365+$auctionNamespace->days));
            $offerStatusMapper->save($offerStatus);
            $auctionNamespace->unsetAll();
            
            $this->_helper->redirector('details', 'auctions','default',array('id'=>$auction_id));
        }
        $this->_helper->redirector('auction-summary', 'mymca');
    }

    /**
     * @brief Akcja change
     * 
     * Akcja wyświetla formularze do zmiany:
     * - Adresu,
     * - Hasła,
     * - Wizytówki (porzucone),
     * - Emiala,
     * w zalezności od parametru.
     * 
     */
    public function changeAction()
    {
        $params = $this->_request->getParams();
        
        switch ($params['my']){
            case 'address':
                $this->view->form = new Application_Form_ChangeAddress();
                $this->view->item = 'adresu';
                break;
            case 'password':
                $this->view->form = new Application_Form_ChangePassword();
                $this->view->item = 'hasła';
                break;
            case 'info':
                $this->view->form = new Application_Form_ChangeInfo();
                $this->view->item = 'wizytówki';
                break;
            case 'email':
                $this->view->form = new Application_Form_ChangeEmail();
                $this->view->item = 'edres e-mail';
                break;
           default:
                $this->_helper->redirector('index', 'mymca');
                break;
        }
        
    }

    /**
     * @brief Akcja change user
     * 
     * Akcja wykonująca zmianę określonych parametrów konta użytkownika, w 
     * następstwie wypełnienia jednego z formularzy z akcji change.
     * Akcja nie posiada własnego widoku.
     */
    public function changeUserAction()
    {
        $params = $this->_request->getParams();
        if($this->getRequest()->isPost()){
              switch ($params['type']){
                case 'address':
                    $form = new Application_Form_ChangeAddress(); 
                    break;
                case 'password':
                    $form = new Application_Form_ChangePassword();
                    break;
                case 'info':
                    $form = new Application_Form_ChangeInfo();
                    break;
                case 'email':
                    $form = new Application_Form_ChangeEmail();
                    break;
               default:
                    $this->_helper->redirector('index', 'mymca');
                    break;
            }
            
            $mapper = new Application_Model_MarketEntityMapper();
            $user = $mapper->find($this->_user->login);
            
            
            if($form->isValid($this->getRequest()->getPost())){
                
                switch ($params['type']){
                case 'address':
                    $user->setAddress($form->getValues());
                    $response = 'Zmieniono adres';
                    break;
                case 'password':
                    $response = $user->changePassword($params['password'],$params['newpassword']);
                    break;
                case 'info':
                    $user->setDescription($params['info']);
                    $response = 'Zmieniono opis';
                    break;
                case 'email':
                    $user->setEmail($params['email']);
                    $this->_user->email = $user->getEmail();
                    $response = 'Zmieniono email';
                    break;
                }
                $mapper->save($user, TRUE);
                
            } else {
                $this->_helper->flashMessenger->addMessage('error/Wprowadzono błędne dane!');
                $this->_helper->redirector('index', 'mymca');                      
            }
        }
        
        $this->_helper->flashMessenger->addMessage('success/'.$response.' !');
        $this->_helper->redirector('index', 'mymca');
    }

    /**
     * @brief Akcja make offer
     * 
     * Metoda umozliwiająca zarówno tworzenie nowej oferty jak i edycję starej.
     * 
     */
    public function makeOfferAction()
    {
        
        $temp = new Zend_Session_Namespace('temp');
        if(isset ($temp->auction_id)){
            //zarządzanie sesją z numerem aukcji (jak nie powiedzie się zapisanie to wrócimy tutaj)
            $auction_id = $temp->auction_id;
            $temp->unsetAll();
            $temp->auction_id = $auction_id;
            $temp->setExpirationHops(2, 'auction_id');
            //sprawdzenie czy aukcja istnieje
            $auctionMapper =  new Application_Model_AuctionMapper();
            $auction = $auctionMapper->find($temp->auction_id);
            if(empty($auction)){
                $this->_helper->flashMessenger->addMessage('error/Aukcja o podanym id nie istnieje');
                $this->_helper->redirector('index', 'mymca');
            }
            //sprawdzenie czy mozna złożyć/zmienić ofertę
            if($auction->getMarketEntity_id() == $this->_user->login){
                $this->_helper->flashMessenger->addMessage('error/Nie możesz składać ofert w stworzonej przez siebie aukcji!');
                $this->_helper->redirector('details', 'auctions','default',array('id'=>$auction_id));
            }
            $startTime = new Zend_Date($auction->getStartTime());
            $endTime = new Zend_Date($auction->getEndTime());
            if($endTime->isEarlier(Zend_Date::now()) || $startTime->isLater(Zend_Date::now())){
                $this->_helper->flashMessenger->addMessage('error/Aukcja została zakończona!');
                $this->_helper->redirector('details', 'auctions','default',array('id'=>$auction_id));
            }
            $this->view->auction_id = $auction_id;
            $firstOffer = $auction->getStartingOffer();
            $form = new Application_Form_MakeOffer();
            foreach ($firstOffer->getComponents() as $component){
                $form->addItem($component->getCommodity_id(),
                               $component->getCommodity()->getName(),
                               $component->getShareFactor());
            }
            $form->addSubmit();
            
            $this->view->headMsg = 'Dodaj swoją ofertę';
            
            $offerMapper = new Application_Model_OfferMapper();
            $previousOffer = current($offerMapper->fetchAll('Auction_id = '.$auction_id.' and MarketEntity_id = "'.$this->_user->login.'"'));
            if(!empty($previousOffer)){
                $this->view->headMsg = 'Zaktualizuj swoją ofertę';
                $data['offeredPrice'] = $previousOffer->getOfferedPrice();
                $data['maxVolume'] = $previousOffer->getMaxVolume();
                $data['minVolume'] = $previousOffer->getMinVolume();
                foreach ($previousOffer->getComponents() as $pComponent){
                    $data['itemNR'.$pComponent->getCommodity_id()] = $pComponent->getQuantity();
                }
                
                $form->populate($data);
                
            }
            
            $this->view->form = $form;
            $request = $this->getRequest();
            if($request->isPost()){
                $post = $request->getPost();
                $legit = TRUE;
                if($post['maxVolume']<$post['minVolume']){
                    $legit = FALSE;
                    $this->view->messages[] = 'error/Nie zgadza się liczba pakietów!';
                }
                $zeros = TRUE;
                foreach ($post as $key=>$value){
                    $val = explode('NR', $key);
                    if(isset($val[1])){
                        $quantity[$val[1]] = $value;
                        if($value > 0){
                            $zeros = FALSE;
                        }
                    }
                }
                if($zeros){
                    $legit = FALSE;
                    $this->view->messages[] = 'error/Oferta musi dotyczyć conajmniej jednego towaru!';
                }
                //sprawdzenie formularza
                if($form->isValid($post) && $legit){
                    
                    
                    if(!empty($previousOffer)){
                        //aktualizacja oferty
                        $previousOffer->setOfferedPrice($post['offeredPrice']);
                        $previousOffer->setMinVolume($post['minVolume']);
                        $previousOffer->setMaxVolume($post['maxVolume']);
                        $newOffer_id = $offerMapper->save($previousOffer);
                        $update = TRUE;
                        $this->_helper->flashMessenger->addMessage('success/Zmieniłeś swoją ofertę');
                    } else {
                        //tworzenie nowej oferty (dane z formularza + dane stałe)
                        $offer = new Application_Model_Offer($post);
                        $offer->setFirstOffer(0);
                        $offer->setAuction_id($auction_id);
                        $offer->setMarketEntity_id($this->_user->login);
                        $newOffer_id = $offerMapper->save($offer);
                        
                        //dodajemy nowe statusy
                        $offerStatusMapper = new Application_Model_OfferStatusMapper(); 
                        //pierwszy status - oferta otwarta
                        $offerStatus = new Application_Model_OfferStatus();
                        $offerStatus->setOffer_id($newOffer_id);
                        $offerStatus->setStatus('Otwarta');
                        $offerStatus->setStartTime($this->getDateTime(0));
                        $offerStatus->setEndTime($auction->getEndTime());
                        $offerStatusMapper->save($offerStatus);
                        
                        //drugi status - oferta zamknięta
                        $offerStatus2 = new Application_Model_OfferStatus();
                        $offerStatus2->setOffer_id($newOffer_id);
                        $offerStatus2->setStatus('Zamknięta');
                        $offerStatus2->setStartTime($auction->getEndTime());
                        $offerStatus2->setEndTime($this->getDateTime(365, $auction->getEndTime()));
                        $offerStatusMapper->save($offerStatus2);
                        //wyłączenie update 
                        $update = FALSE;
                        $this->_helper->flashMessenger->addMessage('success/Dodałeś nową ofertę!');
                    }
                    //dodajemy lub zmieniamy componenty oferty
                    $offerComponentMapper = new Application_Model_OfferComponentMapper();
                    foreach ($firstOffer->getComponents() as $component){
                        $newComponent = new Application_Model_OfferComponent();
                        $newComponent->setCommodity_id($component->getCommodity_id());
                        $newComponent->setShareFactor(-1*$component->getShareFactor());
                        $newComponent->setQuantity($quantity[$component->getCommodity_id()]);
                        $newComponent->setOffer_id($newOffer_id);
                        $offerComponentMapper->save($newComponent, $update);          
                    }
                    //wykonujemy bilansowanie
                    $balance = new Application_Model_Balancing($auction_id);
                    $balance->makeMagic();
                    //reditect
                    $this->_helper->redirector('details', 'auctions','default',array('id'=>$auction_id));
                }
            }
            
                    
        } else {
            //jak wygasła sesja z id aukcji to nic nie zrobimy, więc redirect
            $this->_helper->flashMessenger->addMessage('warning/Sesja wygasła!');
            $this->_helper->redirector('index', 'mymca');
        }
    }

    /**
     * @brief Akcja current offers
     * 
     * Metoda wyświetla listy aktualnie trwających aukcji użytkownika oraz
     * ofert o statusie otwartym.
     */
    public function currentOffersAction()
    {
        $request = $this->getRequest();
        $page = $request->getParam('page');
        

        
        $mapper =  new Application_Model_AuctionMapper();


            $offers = $mapper->fetchUserAuctionsByStatus('open', $this->_user->login);
            $paginator = new Zend_Paginator(new Zend_Paginator_Adapter_Array($offers));
            $paginator->setCurrentPageNumber($page);
            $paginator->setItemCountPerPage(20);           
            $this->view->auctions = $paginator;
            $this->view->user = $this->_user->login;
        
        
    }

    /**
     * @brief Akcja closed offers
     * 
     * Metoda wyświetla listę zakończonych aukcji użytkownika oraz
     * ofert o statusie zamkniętym.
     */
    public function closedOffersAction()
    {
        $request = $this->getRequest();
        $page = $request->getParam('page');
        

        
        $mapper =  new Application_Model_AuctionMapper();


            $offers = $mapper->fetchUserAuctionsByStatus('closed', $this->_user->login);
            $paginator = new Zend_Paginator(new Zend_Paginator_Adapter_Array($offers));
            $paginator->setCurrentPageNumber($page);
            $paginator->setItemCountPerPage(20);           
            $this->view->auctions = $paginator;
            $this->view->user = $this->_user->login;

        
    }

    /**
     * @brief Akcja nodes
     * 
     * Akcja umożliwia zarządzanie lokalizacjami użytkownika.
     * Możliwe jest przeglądanie listy już przypisanych lokalizacji. 
     * Akcja również jest odpowiedzialna za dodawanie nowych lokalizacji.
     * Akcja sprawdza, czy lokalizacja nie została już wcześniej dodana.
     * 
     */
    public function nodesAction()
    {
        $request = $this->getRequest();
        
        $form = new Application_Form_NodeSelect();
        
        $mapper = new Application_Model_NodeAffiliationMapper();
        
        
        
        if($request->isPost()){
            if($form->isValid($request->getPost())){
                
                if(!$mapper->checkAffiliation($this->_user->login, $form->getValue('location')))
                {
                    $affiliation = new Application_Model_NodeAffiliation();
                    $affiliation->setMarketEntity($this->_user->login);
                    $affiliation->setNetworkNode_id($form->getValue('location'));

                    $mapper->save($affiliation);
                } else {
                    $this->_helper->flashMessenger->addMessage('error/Już wprowadzono tą lokalizację!');
                    $this->_helper->redirector('nodes', 'mymca'); 
                }
            }
        }     
        
        
        $this->view->nodes = $mapper->fetchNodes($this->_user->login);
        $this->view->form = $form;
    }

    /**
     * @brief Akcja delete node
     * 
     * Akcja usuwająca przynależność danej lokalizacji do użytkownika.
     * Akcja nie posiada własnego widoku.
     */
    public function deleteNodeAction()
    {
        $entity = $this->_user->login;
        
        $node = $this->getRequest()->getParam('node');
        
        $mapper = new Application_Model_NodeAffiliationMapper();
        $mapper->delete($entity, $node);
        
        $this->_helper->flashMessenger->addMessage('success/Usunięto lokalizację!');
        $this->_helper->redirector('nodes', 'mymca'); 
    }

    /**
     * @brief Akcja delete commodity
     * 
     * Akcja usuwająca towar. Sprawdzane jest, czy użytkownik ma prawo do usunięcia 
     * towaru. Nie mogą być usuwane już użyte towary oraz towary zdefiniowane przez 
     * innego użytkownika. Akcja nie posiada własnego widoku.
     * 
     */
    public function deleteCommodityAction()
    {
        $id = $this->getRequest()->getParam('id');
        if(empty($id)){
            $this->_helper->flashMessenger->addMessage('error/Nie podano identyfikatora towaru!');
            $this->_helper->redirector('commodities', 'mymca'); 
        }
        
        $mapper = new Application_Model_CommodityMapper();
        $commodity = $mapper->find($id);
        
        if(empty($commodity)){
            $this->_helper->flashMessenger->addMessage('error/Nie istnie towar o podanym identyfiaktorze!');
            $this->_helper->redirector('commodities', 'mymca'); 
        }
        
        if($commodity->getMarketEntity_id() != $this->_user->login){
            $this->_helper->flashMessenger->addMessage('error/Podany towar nie nalezy do ciebie!');
            $this->_helper->redirector('commodities', 'mymca'); 
        }
        
        if($commodity->getUsed() == 1){
            $this->_helper->flashMessenger->addMessage('error/Podany towar jest już używany!');
            $this->_helper->redirector('commodities', 'mymca'); 
        }
        
        $mapper->delete($id);
        
        
        $this->_helper->flashMessenger->addMessage('success/Usunięto towar!');
        $this->_helper->redirector('commodities', 'mymca'); 
        
        
    }

    /**
     * @brief Akcja delete period
     * 
     *  Akcja usuwająca termin dostawy z kalendarza. Usunięte mogą być tylko nieużywane 
     *  terminu użytkownika. Akcja nie posiada własnego widoku.
     * 
     */
    public function deletePeriodAction()
    {
        $id = $this->getRequest()->getParam('id');
        
        $mapper = new Application_Model_CalendarPeriodMapper();
        if($mapper->delete($id, $this->_user->login)){
            $this->_helper->flashMessenger->addMessage('success/Usunięto okres dostaw!');
        } else {
            $this->_helper->flashMessenger->addMessage('error/Nie udało sie usunąc okresu dostaw!');
        }
        $this->_helper->redirector('periods', 'mymca'); 
        
    }

    /**
     * @brief Akcja edit period
     * 
     * Akcja umożliwiająca edycję terminu dostaw. Formularz edycji jest uzupełniany
     * uprzednio wprowadzonymi danymi.
     * 
     */
    public function editPeriodAction()
    {
        $request = $this->getRequest();
        $id = $request->getParam('id');
        if(empty($id)){
            $this->_helper->flashMessenger->addMessage('error/Nie podano identyfikatora okresu dostaw!');
            $this->_helper->redirector('periods', 'mymca'); 
        }
        
        $mapper = new Application_Model_CalendarPeriodMapper();
        $period = $mapper->find($id);
        
        if(empty($period)){
            $this->_helper->flashMessenger->addMessage('error/Nie istnieje okresu dostaw o podanym identyfikatorze!');
            $this->_helper->redirector('periods', 'mymca');
        }
        
        if($period->getMarketEntity_id() != $this->_user->login)
        {
            $this->_helper->flashMessenger->addMessage('error/Nie można cudzego okresu dostaw!');
            $this->_helper->redirector('periods', 'mymca');
        }
        
        if(Zend_Date::now()->isLater($period->getEndTime())){
            $this->_helper->flashMessenger->addMessage('error/Nie można zmieniać starego okresu dostaw!');
            $this->_helper->redirector('periods', 'mymca');
        }
        
        $start = new Zend_Date($period->getStartTime());
        $end = new Zend_Date($period->getEndTime());
        
        $data = array(
          'endTime'=>$end->toString('dd/MM/YYYY'), 
          'startTime' => $start->toString('dd/MM/YYYY'),
          'name' => $period->getName(),
        ); 
        
        $form = new Application_Form_AddPeriod();
        $form->populate($data);
        
        if($request->isPost()){
            if($form->isValid($request->getPost())){
                $period->setName($form->getValue('name'));
                $startTime = new Zend_Date($period->getStartTime(),'dd/MM/YYYY');
                $endTime = new Zend_Date($period->getEndTime(),'dd/MM/YYYY');
                if($startTime->isEarlier($endTime) && ($startTime->isLater(Zend_Date::now()))){
                    $period->setStartTime($startTime->toString('YYYY-MM-dd HH:mm:ss'));
                    $period->setEndTime($endTime->toString('YYYY-MM-dd HH:mm:ss'));
                    $mapper->save($period);
                    $this->_helper->flashMessenger->addMessage('success/Zmodyfikowano okres dostaw!');
                    $this->_helper->redirector('periods', 'mymca');
                } else {
                    $this->view->messages[] = 'error/Wprowadzono błędne daty';
                    
                }  
            }
        }
        
        $this->view->form = $form;
        
        
    }
    
    /**
     * @brief Standardowa metoda kończąca działanie akcji
     * 
     * Umożliwia wyświetlenie stopki strony.
     */
    public function postDispatch()
    {
        $this->view->render('utility/_footbox.phtml');
        
    }
    
    /**
     * @brief Metoda zamieniająca format daty na ISO
     * 
     * @param string $date
     * @return string Data w formacie ISO
     */
    private function DBdate($date)
    {
    $date = new Zend_Date($date,'DD/MM/YYYY');
    return $date->getIso();
    }

    /**
     * @bief Metoda zwracająca datę odległą o parę dni.
     * 
     * Zwracana jest data w formacie ISO.
     * 
     * @param int $days
     * @param string $iso
     * @return string w formacie ISO 
     */
    private function getDateTime($days, $iso = null)
    {
        if(empty($iso)){
        $date = Zend_Date::now();
        } else {
            $date = new Zend_Date($iso);
        }
        $date->add($days, Zend_Date::DAY);
        return $date->getIso();
    }

    /**
     * @brief Metoda porównująca dwie daty.
     * 
     * @param string $one
     * @param string $two
     * @return bool TRUE jak data pierwsza jest wcześniej niż druga, FALSE w przeciwnym wypadku 
     */
    private function compareDates($one, $two)
    {
        $date1 = new Zend_Date($one);
        $date2 = new Zend_Date($two);
        return $date1->isEarlier($date2);
    }

    
}


